
-- 文件操作

--[[
    简单模式（simple model）拥有一个当前输入文件和一个当前输出文件，并且提供针对这些文件相关的操作。

    完全模式（complete model） 使用外部的文件句柄来实现。它以一种面对对象的形式，将所有的文件操作定义为文件句柄的方法

    打开文件 ：file = io.open (filename [, mode])

    mode 介绍 ：
        r : 以只读的方式打开，该文件必须存在
        w : 打开只写文件，若文件存在则覆盖写入；若文件不存在则创建
        a : 以追加的方式打开只写文件，文件存在则追加内容，文件不存在则创建
        r+ : 可读写
        w+ : 可读写
        a+ : 可读写
        b : 二进制模式
        + ： 表示对文件可读写
--]]
-- 以只读方式打开文件
file = io.open("d01.lua",'r')

-- 设置默认输入文件为 test.lua
io.input(file)

-- 输出文件第一行
print(io.read())

-- 关闭打开的文件
io.close(file)

print('------------------------------------------------------------')
-- 以附加的方式打开只写文件
file = io.open("d08-file-test.lua", "a")

-- 设置默认输出文件为 test.lua
io.output(file)

-- 在文件最后一行添加 Lua 注释
io.write("--  test.lua 文件末尾注释\n")

-- 关闭打开的文件
io.close(file)
print('------------------------------------------------------------')

-- 完全模式
-- 通常我们需要在同一时间处理多个文件
-- 以只读方式打开文件
file = io.open("d08-file-test.lua", "r")

-- 输出文件第一行
print(file:read())

-- 关闭打开的文件
file:close()

-- 以附加的方式打开只写文件
file = io.open("d08-file-test.lua", "a")

-- 在文件最后一行添加 Lua 注释
file:write("-- test ")

-- 关闭打开的文件
file:close()

print('------------------------------------------------------------')

-- 错误处理
--[[
    我们可以使用两个函数：assert 和 error 来处理错误
    assert() : 断言，第一个参数 ： 断言表达式； 第二个参数 ： 错误抛出的提示信息
    error(message ,level) : 终止正在执行的函数，并返回message的内容作为错误信息(error函数永远都不会返回)
        Level参数指示获得错误的位置:

            Level=1[默认]：为调用error位置(文件+行号)
            Level=2：指出哪个调用error的函数的函数
            Level=0:不添加错误位置信息
--]]

local function add(a,b)
    assert(type(a) == "number", "a 不是一个数字")
    assert(type(b) == "number", "b 不是一个数字")
    return a+b
end
--add(10)
print('------------------------------------------------------------')

-- pcall 和 xpcall、debug
--[[
    Lua中处理错误，可以使用函数pcall（protected call）来包装需要执行的代码。

    pcall接收一个函数和要传递给后者的参数，并执行，执行结果：有错误、无错误；返回值true或者或false, errorinfo。

    语法格式如下
        if pcall(function_name, ….) then
            -- 没有错误
        else
            -- 一些错误
        end
--]]
pcall(function(i) print(i) end, 33)
pcall(function(i) print(i) error('error..') end, 33)
